﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Clinica_Frba.UserInterface.ABM.Afiliado;
using Clinica_Frba.UserInterface.ABM.Rol;
using Clinica_Frba.UserInterface.ABM.Profesional;
using Clinica_Frba.UserInterface.ABM.Planes;
using Clinica_Frba.UserInterface.ABM.EspecialidadesMedicas;
using Clinica_Frba.UserInterface.Registrar_Agenda;
using Clinica_Frba.UserInterface.Login;
using Clinica_Frba.UserInterface.Pedir_Turno;
using Clinica_Frba.UserInterface.Registro_de_Usuario;
using Clinica_Frba.UserInterface.Registro_de_LLegada;
using Clinica_Frba.UserInterface.Registro_Resultado_Atencion;
using Clinica_Frba.UserInterface.Compra_de_Bono;
using Clinica_Frba.UserInterface.CancelarAtencion;
using Clinica_Frba.UserInterface.Generar_Receta;
using Clinica_Frba.UserInterface.Listados_Estadisticos;
using System.Data.SqlClient;


namespace Clinica_Frba
{
    
    public partial class MenuPrincipal : Form
    {        
        public string rolUsuario;
        public string username;
        private MenuPrincipal menuAnterior;
        private Button[] botonera;
        private string string_connection;

        public MenuPrincipal(string conexion)
        {
            InitializeComponent();
            usuarioLabel.Text = "";
            this.string_connection = conexion;
        }

        public MenuPrincipal(string rol,string nombreUsuario,MenuPrincipal anterior,string conexion)
        {
            InitializeComponent();
            this.rolUsuario = rol;
            this.username = nombreUsuario;
            this.menuAnterior = anterior;
            this.string_connection = conexion;
            usuarioLabel.Text = nombreUsuario;
            usuarioLabel.Text  += " ("+rol+")";
            cargarBotonera();
            loginButton.Text = "Logout";
            this.mensaje_label.Text = "";
            

        }

        private void loginButton_Click(object sender, EventArgs e)
        {
            if (loginButton.Text == "Logout")
            {
                this.Close();
                menuAnterior.Show();
            }
            else
            {
                Login log = new Login(this, this.string_connection);
                this.Hide();
                log.Show();
            }
        }


        private void MenuPrincipal_Load(object sender, EventArgs e)
        {

        }

        public void desactivar_login()
        {
            this.loginButton.Enabled=false;
        }
        public void salir()
        {
            this.Close();
        }

        /**
         * Dado un rol por su nombre, obtengo el listado de funcionalidades que tiene asociadas.
         * */
        private List<string> obtenerFuncionalidades()
        {
            List<string> funciones = new List<string>();
            string connString = this.string_connection;
            string consulta = "SELECT func_nombre " +
                "FROM [vacuna_gdd].rol, [vacuna_gdd].rol_funcionalidad, [vacuna_gdd].funcionalidad " +
                "WHERE func_id=rf_func_id AND rf_rol_id=rol_id AND rol_nombre= '" + this.rolUsuario + "'";
            using (SqlConnection conn = new SqlConnection(connString))
            {
                SqlCommand cmd = new SqlCommand(consulta, conn);
                try
                {
                    conn.Open();
                    SqlDataAdapter data = new SqlDataAdapter(consulta, conn);
                    DataSet set = new DataSet();
                    data.Fill(set, "tablaprueba");
                    //dataGridView1.DataSource = set.Tables["tablaprueba"];
                    //dataGridView1.Refresh();
                    foreach (DataTable table in set.Tables)
                    {
                        foreach (DataRow row in table.Rows)
                        {
                            foreach (DataColumn column in table.Columns)
                            {
                                string rowColumn = row[column].ToString();
                                if (rowColumn != "")
                                    funciones.Add(rowColumn);
                                
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // cerramos la conexion
                    if (conn.State != ConnectionState.Closed)
                        conn.Close();
                    // destruimos la conexion
                    conn.Dispose();
                }
            }
            return funciones;
        }

        private void cargarBotonera()
        {
            int i = 0;
            List<string> funcionesRol = obtenerFuncionalidades();
            int tam = funcionesRol.Count;
            this.botonera = new Button[tam];
            foreach (string funcion in funcionesRol)
            {
                Button btn = new Button();
                btn.Name = funcion.Replace(' ','_')+"_btn";
                btn.Text = funcion;
                btn.Click += new System.EventHandler(funcion_boton_handler);
                btn.AutoSize = true;
                btn.Top = i * 33;
                btn.Left = 140;
                //btn.Location = new System.Drawing.Point(10 * i, 20 * i);
                this.botonera[i++]=btn;
                //this.panelBotones.Controls.Add(btn);
                this.panelBotones.Controls.AddRange(this.botonera);
            }
            this.salir_btn.Top = this.panelBotones.Top+this.panelBotones.Height;
            this.salir_btn.Left = this.panelBotones.Left + this.panelBotones.Width - this.salir_btn.Width;
            
        }

        private void funcion_boton_handler(Object sender, System.EventArgs e)
        {            
            Button btn = sender as Button;
            switch (btn.Text)
            {
                case "ABM Rol":
                    AbmRolForm abmRoles = new AbmRolForm();
                    abmRoles.Show();
                    break;
                case "Registro de usuario":
                    MessageBox.Show("Funcionalidad no implementada");
                    break;
                case "ABM Afiliado":
                    AbmAfiliado abmAfil = new AbmAfiliado();
                    abmAfil.Show();
                    break;
                case "ABM Profesional":
                    AbmProfesionalForm abmProfesional = new AbmProfesionalForm(this.string_connection);
                    abmProfesional.Show();
                    break;
                case "ABM Especialidades Medicas":
                    AbmEspecialidadMedica abmEspecialidad = new AbmEspecialidadMedica();
                    abmEspecialidad.Show();
                    break;
                case "ABM Planes Medicos":
                    AbmPlanes abmPlan = new AbmPlanes();
                    abmPlan.Show();
                    break;
                case "Registrar agenda":
                    if (this.rolUsuario == "administrador")
                    {
                        AbmProfesionalForm gestionProfesionales = new AbmProfesionalForm(this.string_connection);
                        gestionProfesionales.Show();
                    }else{ // quiere decir que es un profesional ya que otro rol no tendría acceso a esta funcion                        
                        RegistrarAgenda registrarAg = new RegistrarAgenda(this.username,this.string_connection);
                        registrarAg.Show();
                    }
                    
                    break;
                case "Compra de bonos":
                    FormCompraBono compra = new FormCompraBono(this);
                    compra.Show();
                    break;
                case "Pedir Turno":
                    PedirTurno turno = new PedirTurno();
                    turno.Show();
                    break;
                case "Registro de resultado de atencion":
                    RegistroResultadoAtencion resultados = new RegistroResultadoAtencion();
                    resultados.Show();
                    break;
                case "Registro de llegada para atencion":
                    RegistroDeLLegadas llegadas = new RegistroDeLLegadas();
                    llegadas.Show();
                    break;
                case "Cancelar atencion":
                    CancelarAtencion cancelarTurno = new CancelarAtencion();
                    cancelarTurno.Show();
                    break;
                case "Generar Receta":
                    GenerarReceta receta = new GenerarReceta();
                    receta.Show();
                    break;
                case "Listado estadistico":
                    ListadosEstadisticos listados = new ListadosEstadisticos();
                    listados.Show();
                    break;
            }
        }

        private void salir_btn_Click(object sender, EventArgs e)
        {
            if (menuAnterior != null)
                this.menuAnterior.salir();
            else
                this.salir();
        }

    }
}
